package io.esirong.manager;


/**
 * @ClassName: AccountManager
 * @Description: 帐号管理
 * 设计于当用用户信息的管理（缓存，复用，共享等）
 * 可以通过配置项目来确认你需要的服务（将会通三内存缓存，磁盘，数据库）
 */
public class AccountManager {
    private AccessToken accessToken;
    private AccessTokenCache accessTokenCache;
    private Account account;

    private AccountManager() {
        loadCurrentAccessToken();
    }

    public static void init() {
        /*初始化验证信息数据*/
        getInstance();
    }

    public static void saveAccount(AccessToken accessToken) {
        setAccessToken(accessToken);
    }

    public static Account getAccount() {
        return getInstance().account;
    }

    private boolean loadCurrentAccessToken() {
        //加载缓存的登录口令
        if (accessTokenCache == null) {
            accessTokenCache = new AccessTokenCache();
        }
        AccessToken accessToken = accessTokenCache.load();

        if (accessToken != null) {
            setAccessToken(accessToken, false);
            return true;
        }

        return false;
    }

    /**
     * 获取用户验证信息
     *
     * @return {@link AccessToken}
     */
    public static AccessToken getAccessToken() {
        return getInstance().account.getAccessToken();
    }

    public static void setAccessToken(AccessToken accessToken) {
        getInstance().setAccessToken(accessToken, true);
    }

    private void setAccessToken(AccessToken currentAccessToken, boolean saveToCache) {

        this.accessToken = currentAccessToken;

        if (saveToCache) {
            if (currentAccessToken != null) {
                accessTokenCache.save(currentAccessToken);
            } else {
                accessTokenCache.clear();
            }
        }
        //通知访问登录口令更新了
        notifyAccessTokenChanged();
    }

    private void notifyAccessTokenChanged() {
        /*通知帐号验证信息变更*/
    }

    public static AccountManager getInstance() {
        return AccountManager.SingletonHolder.INSTANCE;
    }

    private static class SingletonHolder {
        /*静态模式单例*/
        private static final AccountManager INSTANCE = new AccountManager();

    }


}
